package com.solo.common.redis.utils;

import cn.hutool.extra.spring.SpringUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.redisson.api.RMap;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;


/**
 * 本地缓存操作工具类
 * @author 十一
 * @since 2024/11/29
 * 人生若只如初见，何事秋风悲画扇
 **/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@SuppressWarnings(value = {"unchecked"})
public class CacheUtils {

    private static final CacheManager CACHE_MANAGER = SpringUtil.getBean(CacheManager.class);

    /**
     * 获取缓存组内所有的KEY
     * @param cacheNames 缓存组名称
     */
    public static Set<Object> keys(String cacheNames) {
        RMap<Object, Object> rmap = (RMap<Object, Object>) CACHE_MANAGER.getCache(cacheNames).getNativeCache();
        return rmap.keySet();
    }

    /**
     * 获取缓存值
     * @param cacheNames 缓存组名称
     * @param key 缓存key
     */
    public static <T> T get(String cacheNames, Object key) {
        Cache.ValueWrapper wrapper = CACHE_MANAGER.getCache(cacheNames).get(key);
        return wrapper != null ? (T) wrapper.get() : null;
    }

    /**
     * 保存缓存值
     * @param cacheNames 缓存组名称
     * @param key 缓存key
     * @param value 缓存值
     */
    public static void put(String cacheNames, Object key, Object value) {
        CACHE_MANAGER.getCache(cacheNames).put(key, value);
    }

    /**
     * 删除缓存值
     * @param cacheNames 缓存组名称
     * @param key 缓存key
     */
    public static void evict(String cacheNames, Object key) {
        CACHE_MANAGER.getCache(cacheNames).evict(key);
    }

    /**
     * 清空缓存值
     * @param cacheNames 缓存组名称
     */
    public static void clear(String cacheNames) {
        CACHE_MANAGER.getCache(cacheNames).clear();
    }

    /**
     * 获取指定缓存组下所有的List缓存数据
     * @param cacheNames 缓存组名称
     * @return 包含所有List缓存数据的列表，每个元素对应一个缓存key对应的List数据，如果某个key对应的不是List类型则会被忽略
     */
    public static <T> List<T> list(String cacheNames) {
        Set<Object> keySet = keys(cacheNames);
        List<T> resultLists = new ArrayList<>();
        for (Object key : keySet) {
            T value = get(cacheNames, key);
            resultLists.add(value);
        }
        return resultLists;
    }

}
